package com.neuedu.corejava.ch7.abs;
/**
 * 
 * 1、使用abstract修饰的方法叫抽象方法，抽象方法没有方法体（没有大括号）。
 * 2、一个类如果包含有抽象方法，则这个类必须是抽象类；
 *              注意：抽象类不一定包含抽象方法，抽象类可以不包含抽象方法。
 * 3、在抽象类中，可以同时包含抽象方法和非抽象方法。
 * 4、使用abstract修饰的类叫抽象方法，抽象类不能进行实例化（抽象类不能使用new关键词进行实例化）。
 * 5、子类必须去实现或重写父类定义的抽象方法：
 *               即 当需要子类重写或实现方式时，可以使用把特定的方法声明为抽象方法（对应的类就是抽象类）。
 * 6、抽象在继承过程的理解：
                   一个子类继承了一个抽象类，也会继承该父类的抽象方法；
                   如果父类包含抽象方法，则子类必须实现抽象方法（子类也是抽象类除外）。
 * 7、抽象方法： 修饰符号  abstract 返回值类型  方法名（  参数列表）：没有方法体
 * 
 * 
 * 
 * @author admin
 *
 */

//使用abstract修饰的类叫抽象方法，抽象类不能进行实例化。
//final和abstract不能同时修饰类
//使用final修饰的类称为终止（终结）类，终止（终结）不能被继承，不能有子类
public  abstract class AbstractClass {
	
	//public  void absMethod() {}
	//使用final修饰的变量称为常量
	//常量就是在运行过程中，不能被修改的“变量”
	//属性常量需要在定义时进行初始化，常量一旦被初始化就不能被修改
	//属性常量如果在定义时没有进行初始化，则可以在构造方法初始化一次
	private final int id;
	private final String name;
	
	//类属性（使用static修饰的属性）：类属性必须在定义时进行初始化，一旦被初始化则不能被修改（引用不能被修改）
	public static final String MAN="男";
	
	public AbstractClass() {
		super();
		this.id = 0;
		this.name = "";
	}

	//final修饰的局部变量互参数，不能被修改
	public AbstractClass(final int id, final String name) {
		super();
		final int d;
		d=12;
		//d=13;错误，局部常量一旦被赋值，不能被修改
		
		this.id = id;
		this.name = name;
	}



	//抽象方法： 修饰符号  abstract 返回值类型  方法名（  参数列表）：没有方法体
	//抽象方法不能使用private关键词进行修饰，其它三个访问修饰符号可以
	//抽象方法不能使用static关键词进行修饰
	//抽象方法不能使用final关键词进行修饰，final修饰的方法不能被重写
	public abstract void absMethod();
	
	//使用final修饰的方法称为终止（终结）方法，终结方法不能被重写
	public final void print() {
		System.out.println("打印方法");
	}
	
	public static void main(String[] args) {
		//抽象类一般由非抽象类的子类进行实例化，多态编程
		AbstractClass abstractClass=new SubAbstractClass();
		abstractClass.absMethod();
	}

}
